<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 1. 什么是原型？
    //      在JavaScript中，原型是一个对象，每个JavaScript对象（除null外）都有一个隐藏属性[[Prototype]]（可通过__proto__或Object.getPrototypeOf()访问）
    //     ，这个属性指向它的原型对象。原型对象也是一个普通对象，用于共享属性和方法。

    // 2. 核心特性
    //     共享机制：原型对象包含可被多个对象共享的属性和方法
    //     动态关联：对象与原型之间的关联是动态的，修改原型会影响所有关联对象
    //     基础模板：充当对象创建时的"蓝图"

    // 3. 技术实现
    //     通过内部属性[[Prototype]]实现（ES6规范中的命名）
    //     可通过非标准属性__proto__或标准APIObject.getPrototypeOf()访问

    // 4. 构造函数中的原型
    function Person() {}  // 构造函数
    Person.prototype.say = function() {}  // 原型对象

    const p = new Person();
    // 实例通过__proto__链接到构造函数的prototype
    console.log(p.__proto__ === Person.prototype); // true

    // 5. 特殊原型
    //     Object.prototype是所有普通对象的最终原型
    //     通过Object.create(null)可创建无原型的对象


    // 二、原型链的定义（Prototype Chain）
    //     1. 基本概念
    //         原型链是由多个对象的[[Prototype]]引用串联形成的单向查找链，用于实现属性/方法的继承和共享。

    // 2. 查找规则
    //     当访问对象属性时：
    //         先在对象自身查找
    //         找不到则通过__proto__向上查找原型
    //         递归该过程直到Object.prototype
    //         若最终未找到则返回undefined

    // 3. 代码示例
        const grand = { a: 1 };
        const parent = { b: 2 };
        const child = { c: 3 };

        Object.setPrototypeOf(parent, grand);
        Object.setPrototypeOf(child, W);

        console.log(child.a); // 1，通过原型链查找

    // 4. 关键特点
    //     委托机制：不同于拷贝继承，原型链是动态查找
    //     性能影响：过长的原型链会影响查找效率
    //     终点规则：所有普通对象的原型链终点都是Object.prototype
</script>
</html>